C#で以下のプログラムは0という結果になるようです。不定にはならないようです。
using System;
class Program
{
static void Main(string[] args)
{
int i = 0;
i = i++;
Console.WriteLine(i);
}
}
理由 §
i++;は以下の手順で評価されます。
7.6.9 後置インクリメント演算子と後置デクリメント演算子
(中略)
x++ または x-- の形式の後置インクリメントまたはデクリメント演算子の実行時の処理は、次の手順で構成されています。
• x が変数の場合。
o x を評価して変数を生成します。
o x の値を保存します。
o 保存した x の値を引数として、選択された演算子を呼び出します。
o 演算子から返される値をx の評価によって得られる場所に格納します。
o 保存された x の値が、演算の結果になります。
つまり、i = i++;以下のようになります。
- 変数が生成される
- 変数にiの値(これは0だ)を格納する
- iに1を足す
- 変数から値を取り出して式の値にする
- 変数から値を取り出して(これは0だ)iに代入する (1を足した結果は上書きされて破棄される)
この手順に不確定な曖昧さは(おそらく)ありません。